변수의 라이프사이클과 스코프

과제: 1차원배열의 모든 합을 재귀, 꼬리재귀, for문 세개 코드로 작성하기

예시 코드

const sum = (arr, i=0, acc=0) {
  if (arr.length === i) return acc;
  return sum(arr, acc+arr[i], i+1);
};

코드리뷰

변수의 라이프사이클과 스코프

변수의 스코프는 일반적으로 권한 관련된 얘기, 라이프사이클은 메모리의 점유

‘스코프만큼 살아있는게 아닌가?’ 아니다.
연산과 메모리는 trade off.

같은 스코프라도 라이프사이클을 길게 가져갈 수 있다.
이점은? 연산을 덜 할 수 있다.

const _sum = (arr, i, acc) {  // 초기값을 0으로 안넣어줘도 된다.
  if (arr.length === i) return acc;
  return _sum(arr, acc+arr[i], i+1);
};

const sum = (arr) => _sum(arr, 0, 0);

이렇게 하면 초기값을 안넣어줘도 되는 이점이 있다. 하지만 sum에서만 _sum에 접근 가능하도록 만들고 싶다.

수정

let sum;
{
  const _sum = (arr, i, acc) => {
    if (arr.length === i) return acc;
    return _sum(arr, arr+arr[i], i+1);
  };
  sum = arr => _sum(arr, 0 0);
  }
}

이렇게 하면 _sum은 전역에서 접근할 수 없다. 하지만 let이라는 단점이 있다.

수정

const arraySum = (() => {
  const elementSum = (arr, i, acc) => {
    if (arr.length === i) return acc;
    return elementSum(arr, acc + arr[i], i + 1);
  };
  return elementSum(arr, 0, 0);
})();
// 1번 코드
//elementSum
//scope : arraySum만 알게 했다. lifecycle : arraySum호출할 때 생성되어 리턴시 제거

const arraySum = (() => {
  const elementSum = (arr, i, acc) => {
    if (arr.length === i) return acc;
    return elementSum(arr, acc + arr[i], i + 1);
  };
  const arraySum = arr => elementSum(arr, 0, 0);
  return arraySum;
})();
// 2번 코드
// elementSum
// scope : arraySum만 알게 했다. lifecycle : 영구적

const로 수정했다. 변수명도 알맞게 바꿔줬다.
1번 코드는 라이프사이클이 짧다. 호출할 때마다 elementSum을 불러야해서 연산이 느리지만 메모리는 상시점유하지 않는다.
2번 코드는 라이프사이클을 길게 가져가서 연산성능을 중시한 것.
정답은 없다. 상황에 맞게 선택.

강의링크

코드스피츠 Programming101 - 2강


Written by@Jiyon Lee
뜨거운 코드를 가르며

GitHub